// 寻找峰值，长度为 n 的数组，找峰值返回它的索引，峰值可能有多个，只需返回其中一个索引
// 峰值：指值严格大于左右相邻的元素，不能相等，一直下坡峰值为第一个元素，一直上坡为最后一个元素
// 时间复杂度要求 O(log2 n)

// 核心思路：借鉴二分查找，寻找一个中间的标杆元素，元素右侧下坡不一定有峰值，但是上坡走一定有峰值，最后 left 和 right 重合的地方就是峰值，

function findPeakElement(nums) {
  let [left, right] = [0, nums.length - 1]
  while (left < right) {
    let mid = left + Math.floor((right - left) / 2)
    // 上坡往右找，下坡往左找
    if (nums[mid] < nums[mid + 1]) {
      left = mid + 1
    } else {
      right = mid
    }
  }
  return left
  // 实际这里出现一种情况是有异常的，比如 [1,2,1,4,4] 找到的峰值是 3，下标是 3，实际峰值2，下标 1，原因是这种相当于只在右半区找了，返回的是最后 left 和 right 相汇的位置，而当前峰值和右侧元素其实是相等的，所以出现了问题
}
module.exports = {
  findPeakElement: findPeakElement
};